package com.global.base;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * 工具类
 * @author zly601436
 *
 */
public class Util
{
	protected Util(){ };
	
	/**
	 * 数据类型数组
	 */
	protected static List<String> DATATYPELIST;
	
	/**
	 * Long类型
	 */
	public final static String LONG = "Long";
	/**
	 * Double类型
	 */
	public final static String DOUBLE = "Double";
	/**
	 * Boolean类型
	 */
	public final static String BOOLEAN = "Boolean";	
	/**
	 * Date类型
	 */
	public final static String DATE = "Date";		
	/**
	 * DateTime类型
	 */
	public final static String DATETIME = "DateTime";
	/**
	 * Time类型
	 */
	public final static String TIME = "Time";
	/**
	 * String类型
	 */
	public final static String STRING = "String";
	
	
	/**
	 * 匹配正整数格式，不匹配范围
	 */
	public static final String POSITIVE_INTEGER_REGEXP = "^[0-9]*[1-9][0-9]*$";
	/**
	 * 匹配负整数格式，不匹配范围
	 */	
	public static final String NEGATIVE_INTEGER_REGEXP = "^-[0-9]*[1-9][0-9]*$";	
	/**
	 * 匹配整数格式，不匹配范围
	 */
	public static final String INTEGER_REGEXP = "^-?\\d+$";
	/**
	 * 匹配正浮点数格式，不匹配范围
	 */	
	public static final String POSITIVE_RATIONAL_NUMBER_REGEXP = "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$";
	/**
	 * 匹配负浮点数格式，不匹配范围
	 */	
	public static final String NEGATIVE_RATIONAL_NUMBER_REGEXP = "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$";
	/**
	 * 匹配浮点数格式，包括科学计数法，如：123，-123，1.023，123d，123D，123E+12，-123E-12，不匹配范围
	 */
	 public static final String RATIONAL_NUMBER_REGEXP = "^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?[dD]?$";

	/**
	 * 匹配布尔类型
	 */
	public static final String BOOLEAN_REGEXP = "true|false|y|n|1|0|yes|no";
	
	/**
	 * 错误信息
	 */
	protected static String errorMessage = "";
	
	/**
	 * 返回错误信息
	 * @return
	 */
	public static String getErrorMessage(){
		return errorMessage;
	}
	
	static 
	{			    
	    DATATYPELIST = new ArrayList<String>();
	    DATATYPELIST.add(LONG);
	    DATATYPELIST.add(DOUBLE);
	    DATATYPELIST.add(DATE);
	    DATATYPELIST.add(TIME);
	    DATATYPELIST.add(DATETIME);
	    DATATYPELIST.add(BOOLEAN);
	    DATATYPELIST.add(STRING);
    }	
	
	  /**
     * 返回指定日期所在月份的第一天
     * @param date
     * @return
     */
    public static Date firstDayOfMonth(Date date) {
		errorMessage = "";

		Calendar cal = Calendar.getInstance();
		cal.setTime(date);  // 当前日期
		cal.set(Calendar.DATE, 1);// 设为当前月的1号
        
		return cal.getTime();
	}    
    
    /**
     * 返回指定日期所在月份的最后一天
     * @param date
     * @return
     */
    public static Date lastDayOfMonth(Date date) {
    	errorMessage = "";
    	
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.add(Calendar.MONTH, 1);
        cal.add(Calendar.DATE, -1);
        
        return cal.getTime();
    }
    

	
	/**
	 * 验证字符串是否为布尔型字符串
	 * <br/>验证时不区分大小写
	 * @param value
	 * @return true 表示为字符串, 合法的字符串如 true, false, y, n, 1, 0, yes, no
	 */
	public static boolean isCanToBoolean(String value)
	{		
		errorMessage = "";
		
		Pattern p = Pattern.compile(BOOLEAN_REGEXP, Pattern.CASE_INSENSITIVE); 

		Matcher m = p.matcher(value);

		return m.matches();
	}
	
	/**
	 * 将字符串转换为Boolean类型
	 * @param value
	 * @return null表示不能转换
	 */
	public static Boolean getStrToBoolean(String value)
	{		
		errorMessage = "";
		
		if(StringUtils.isNotBlank(value) && isCanToBoolean(value)){
			String boolTrue = "true|y|1|yes";
			String boolFalse = "false|n|0|no";
			
			Pattern p = Pattern.compile(boolTrue, Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(value);			
			if(m.matches()){
				return Boolean.TRUE;
			}
			
			p = Pattern.compile(boolFalse, Pattern.CASE_INSENSITIVE);
			m = p.matcher(value);			
			if(m.matches()){
				return Boolean.FALSE;
			}
		}else{
			errorMessage = "【" + value + "】不是布尔类型";
		}
		
		return null;
	}
	
	
    
	/**
	 * 验证输入的数据类型是否为数字类型(只是用两种数据类型[long、double]定义数据)
	 * @param dataType  数据类型
	 * @return true 表示为数字类型
	 */
	public static boolean isNumberType(String dataType)
	{
		errorMessage = "";
		
		boolean isConfirm = false;
		
		if(StringUtils.isNotBlank(dataType)){
			isConfirm = dataType.equalsIgnoreCase(LONG) || 
			            dataType.equalsIgnoreCase(DOUBLE);
		}
		
		return isConfirm;
	}

	
	/**
	 * 采用正则表达式的方式，判断源字符串中是否包含某个子字符串
	 * @param str 源字符串
	 * @param regex 被包含的字符串，正则表达式
	 * @param isIgnoreCase 判断时，是否忽略大小写
	 * @return
	 */
	public static boolean isContainSubStr(String str, String regex, boolean isIgnoreCase) {
		errorMessage = "";
		
		boolean isPass = false;

		Pattern pattern = null;
		if(isIgnoreCase){
			pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
		}else{
			pattern = Pattern.compile(regex);
		}

		Matcher isNum = pattern.matcher(str);
		if(isNum.find()){
			isPass = true;
		}

		return isPass;
	}
}